A quantidade de informações geradas atualmente são incríveis e consequentemente a forma como eles estão estruturados pode variar muito, entre elas, o casos dos textos.
Análise de texto não é algo relativamente novo, podemos notar isso em papers e livros sobre análise de discurso ou conteúdo. Ocorre que o poder computacional foi capaz de trazer análises ainda mais escaláveis do que se fazia antes e com uma força quantitativa muito mais robusta.
No R existem muitos pacotes para lidar com textos, que vão desde contar frequência de palavras até rodar modelos estatísticos. Vamos tentar percorrar estes tópicos utilizando como bases os discursos da Dilma e do Temer.
Estes discursos foram obtidos utilizando webscraping e seu código está disponível aqui. Não recomedo baixá-los novamente, vai demorar uma eternidade!
Ao longo das aulas vimos como podemos guardar variáveis tipo texto no R. Estes objetos devem sempre estar entre aspas, sejam as aspas simples '' ou duplas "".
c("Oi", "Tudo", "bem")
[1] "Oi" "Tudo" "bem"
Estes tipos de objetos podem ser manipulados assim como tantos outros objetos, porém não podemos, por exemplo, fazer a média de c("Oi", "Tchau"). Uma das principais função para manipulação de texto no R é o stringr criado por Hadley Wickham. Vamos ver como ele funciona!
A maior parte das funções do stringr tem como prefixo str_, como por exemplo, str_replace(), str_detect() ou str_extract() e para habilitar ela para uso fazemos,
# install.packages("stringr")
library(stringr)
Vamos usar o seguinte vetor como exemplo:
textos <- c("Programacao em R", "Ciências Sociais", "Sociologia", "Programar é legal", "HaDlEy WiCkHaM", "R")
str_lenght()O str_lenght() serve para verificarmos o número de caracteres das palavras. Note que ele é diferente da função length() que apenas conta a quantidade de elementos no vetor.
str_length(textos)
[1] 16 16 10 17 14 1
length(textos)
[1] 6
str_c()O str_c() nos ajuda a concatenar as strings em uma única. Vamos ver um exemplo concatenando os elementos das posições um e dois do nosso vetor “textos”.
str_c(textos[1], textos[2], sep = " para ")
[1] "Programacao em R para Ciências Sociais"
Basicamente, colamos “Programacao em R” e “Ciências Sociais” separado por " para “. Simples, não?
str_to_lower(), str_to_title(), str_to_upper()Estas funções são bem intuitivas, olha só:
str_to_lower(textos)
[1] "programacao em r" "ciências sociais" "sociologia" "programar é legal" "hadley wickham" "r"
str_to_title(textos)
[1] "Programacao Em R" "Ciências Sociais" "Sociologia" "Programar É Legal" "Hadley Wickham" "R"
str_to_upper(textos)
[1] "PROGRAMACAO EM R" "CIÊNCIAS SOCIAIS" "SOCIOLOGIA" "PROGRAMAR É LEGAL" "HADLEY WICKHAM" "R"
str_replace() e str_replace_all()A função str_replace() e str_replace_all() localizam um padrão e o substituem por algo de seu interesse, por exemplo, queremos substituir todas as letras r dos elementos do nosso vetor por Python.
str_replace(textos, "R", "Python")
[1] "Programacao em Python" "Ciências Sociais" "Sociologia" "Programar é legal" "HaDlEy WiCkHaM"
[6] "Python"
Ops, parece que o r em caixa baixa é diferente do R em caixa alta! Isso significa que estas funções são case-sensitive, ou seja, precisamos especificar que queremos transformar tanto “r” e “R” em Python.
mud_R <- str_replace(textos, "R", "Python")
mud_r <- str_replace(mud_R, "r", "Python")
mud_r
[1] "PPythonogramacao em Python" "Ciências Sociais" "Sociologia" "PPythonogramar é legal"
[5] "HaDlEy WiCkHaM" "Python"
Parece que ainda não deu certo! O elemento “PPythonogramar é legal” ainda tem “r” que não foram substituídos. Para solucionar esse problema nós utilizamos str_replace_all() que vai substituir todos os padrões do texto.
mud_r
[1] "PPythonogPythonamacao em Python" "Ciências Sociais" "Sociologia"
[4] "PPythonogPythonamaPython é legal" "HaDlEy WiCkHaM" "Python"
str_detect()O str_detect() irá detectar se existe um padrão específico nos seus textos, como por exemplo, vamos detectar em quais elementos aparecem a palavra programar.
str_detect(textos, "Programar")
[1] FALSE FALSE FALSE TRUE FALSE FALSE
str_extract()O str_extract() extraí um padrão dos elementos do texto.
str_extract(textos, "Programar")
[1] NA NA NA "Programar" NA NA
Existem formas de sinalizarmos alguns padrões nos textos, como por exemplo, falar que queremos o r em caixa baixa ou o R em caixa alta. Estas formas de sinalizar padrões são chamadas de expressões regulares. No wikipedia a definição de regex é a seguinte,
“uma forma concisa e flexível de identificar cadeias de caracteres de interesse, como caracteres particulares, palavras ou padrões de caracteres”
Dê uma pausa e leia o material do Curso R sobre expressões regulares: http://material.curso-r.com/stringr/#express%C3%B5es-regulares
Agora que temos uma noção melhor sobre como manipular textos, vamos analisar os discursos da Dilma e Temer!
Vamos habilitar os pacotes que utilizaremos e abrir os dados com os discursos.
library(tidyverse)
[37m── [1mAttaching packages[22m ──────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──[39m
[37m[32m✔[37m [34mggplot2[37m 2.2.1.[31m9000[37m [32m✔[37m [34mpurrr [37m 0.2.4
[32m✔[37m [34mtibble [37m 1.4.2 [32m✔[37m [34mdplyr [37m 0.7.4
[32m✔[37m [34mtidyr [37m 0.8.0 [32m✔[37m [34mstringr[37m 1.3.1
[32m✔[37m [34mreadr [37m 1.1.1 [32m✔[37m [34mforcats[37m 0.3.0 [39m
[37m── [1mConflicts[22m ─────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[37m [34mdplyr[37m::[32mfilter()[37m masks [34mstats[37m::filter()
[31m✖[37m [34mdplyr[37m::[32mlag()[37m masks [34mstats[37m::lag()[39m
library(lubridate)
Attaching package: ‘lubridate’
The following object is masked from ‘package:base’:
date
library(quanteda)
library(wordcloud2)
library(stringr)
library(tidytext)
library(SnowballC)
discursos <- read_csv("data/discursos.csv")
Parsed with column specification:
cols(
date = col_character(),
title = col_character(),
discourse = col_character(),
link_discourse = col_character(),
who = col_character()
)
O banco de dados tem apenas 5 variáveis, com informações sobre a data, o título do discurso, o link para os discursos, quem os proferiu e o seu cunteúdo. Vamos começar fazendo algumas transoformações básicas.
glimpse(discursos)
Observations: 1,140
Variables: 5
$ date <chr> "12/05/2016 14h22", "10/05/2016 20h47", "09/05/2016 20h45", "09/05/2016 15h21", "07/05/2016 17h03", "06/05/20...
$ title <chr> "Declaração à imprensa da Presidenta da República, Dilma Rousseff - Brasília/DF", "Discurso da Presidenta da ...
$ discourse <chr> "Bom dia. Bom dia senhores e senhoras jornalistas, bom dia - aqui tem parlamentares, ministros, bom dia a tod...
$ link_discourse <chr> "http://www2.planalto.gov.br/acompanhe-o-planalto/discursos/discursos-da-presidenta/declaracao-a-imprensa-da-...
$ who <chr> "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "Dilma", "...
A primeira transformação que faremos vai ser transformar a variável date em um objeto interpretado como data e não string, em seguida transformaremos todas as outras variáveis em caixa baixa para termos um padrão nos dados já que como dissemos, as funções para manipulação de texto são case-sensitive. Além disso, com a variável data padronizada de forma correta, vamos criar uma segunda variável para extrair apenas o ano do discurso. Por fim, criaremos uma variável que detecta se o discurso foi ou não proferido no palácio do planalto.